home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / idlelib / Debugger.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  17KB  |  554 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import os
  5. import bdb
  6. import types
  7. from Tkinter import *
  8. from WindowList import ListedToplevel
  9. from ScrolledList import ScrolledList
  10. import macosxSupport
  11.  
  12. class Idb(bdb.Bdb):
  13.     
  14.     def __init__(self, gui):
  15.         self.gui = gui
  16.         bdb.Bdb.__init__(self)
  17.  
  18.     
  19.     def user_line(self, frame):
  20.         if self.in_rpc_code(frame):
  21.             self.set_step()
  22.             return None
  23.         
  24.         message = self._Idb__frame2message(frame)
  25.         self.gui.interaction(message, frame)
  26.  
  27.     
  28.     def user_exception(self, frame, info):
  29.         if self.in_rpc_code(frame):
  30.             self.set_step()
  31.             return None
  32.         
  33.         message = self._Idb__frame2message(frame)
  34.         self.gui.interaction(message, frame, info)
  35.  
  36.     
  37.     def in_rpc_code(self, frame):
  38.         if frame.f_code.co_filename.count('rpc.py'):
  39.             return True
  40.         else:
  41.             prev_frame = frame.f_back
  42.             if prev_frame.f_code.co_filename.count('Debugger.py'):
  43.                 return False
  44.             
  45.             return self.in_rpc_code(prev_frame)
  46.  
  47.     
  48.     def __frame2message(self, frame):
  49.         code = frame.f_code
  50.         filename = code.co_filename
  51.         lineno = frame.f_lineno
  52.         basename = os.path.basename(filename)
  53.         message = '%s:%s' % (basename, lineno)
  54.         if code.co_name != '?':
  55.             message = '%s: %s()' % (message, code.co_name)
  56.         
  57.         return message
  58.  
  59.  
  60.  
  61. class Debugger:
  62.     vstack = None
  63.     vsource = None
  64.     vlocals = None
  65.     vglobals = None
  66.     
  67.     def __init__(self, pyshell, idb = None):
  68.         if idb is None:
  69.             idb = Idb(self)
  70.         
  71.         self.pyshell = pyshell
  72.         self.idb = idb
  73.         self.frame = None
  74.         self.make_gui()
  75.         self.interacting = 0
  76.  
  77.     
  78.     def run(self, *args):
  79.         
  80.         try:
  81.             self.interacting = 1
  82.             return self.idb.run(*args)
  83.         finally:
  84.             self.interacting = 0
  85.  
  86.  
  87.     
  88.     def close(self, event = None):
  89.         if self.interacting:
  90.             self.top.bell()
  91.             return None
  92.         
  93.         if self.stackviewer:
  94.             self.stackviewer.close()
  95.             self.stackviewer = None
  96.         
  97.         self.pyshell.close_debugger()
  98.         self.top.destroy()
  99.  
  100.     
  101.     def make_gui(self):
  102.         pyshell = self.pyshell
  103.         self.flist = pyshell.flist
  104.         self.root = root = pyshell.root
  105.         self.top = top = ListedToplevel(root)
  106.         self.top.wm_title('Debug Control')
  107.         self.top.wm_iconname('Debug')
  108.         top.wm_protocol('WM_DELETE_WINDOW', self.close)
  109.         self.top.bind('<Escape>', self.close)
  110.         self.bframe = bframe = Frame(top)
  111.         self.bframe.pack(anchor = 'w')
  112.         self.buttons = bl = []
  113.         self.bcont = b = Button(bframe, text = 'Go', command = self.cont)
  114.         bl.append(b)
  115.         self.bstep = b = Button(bframe, text = 'Step', command = self.step)
  116.         bl.append(b)
  117.         self.bnext = b = Button(bframe, text = 'Over', command = self.next)
  118.         bl.append(b)
  119.         self.bret = b = Button(bframe, text = 'Out', command = self.ret)
  120.         bl.append(b)
  121.         self.bret = b = Button(bframe, text = 'Quit', command = self.quit)
  122.         bl.append(b)
  123.         for b in bl:
  124.             b.configure(state = 'disabled')
  125.             b.pack(side = 'left')
  126.         
  127.         self.cframe = cframe = Frame(bframe)
  128.         self.cframe.pack(side = 'left')
  129.         if not self.vstack:
  130.             self.__class__.vstack = BooleanVar(top)
  131.             self.vstack.set(1)
  132.         
  133.         self.bstack = Checkbutton(cframe, text = 'Stack', command = self.show_stack, variable = self.vstack)
  134.         self.bstack.grid(row = 0, column = 0)
  135.         if not self.vsource:
  136.             self.__class__.vsource = BooleanVar(top)
  137.         
  138.         self.bsource = Checkbutton(cframe, text = 'Source', command = self.show_source, variable = self.vsource)
  139.         self.bsource.grid(row = 0, column = 1)
  140.         if not self.vlocals:
  141.             self.__class__.vlocals = BooleanVar(top)
  142.             self.vlocals.set(1)
  143.         
  144.         self.blocals = Checkbutton(cframe, text = 'Locals', command = self.show_locals, variable = self.vlocals)
  145.         self.blocals.grid(row = 1, column = 0)
  146.         if not self.vglobals:
  147.             self.__class__.vglobals = BooleanVar(top)
  148.         
  149.         self.bglobals = Checkbutton(cframe, text = 'Globals', command = self.show_globals, variable = self.vglobals)
  150.         self.bglobals.grid(row = 1, column = 1)
  151.         self.status = Label(top, anchor = 'w')
  152.         self.status.pack(anchor = 'w')
  153.         self.error = Label(top, anchor = 'w')
  154.         self.error.pack(anchor = 'w', fill = 'x')
  155.         self.errorbg = self.error.cget('background')
  156.         self.fstack = Frame(top, height = 1)
  157.         self.fstack.pack(expand = 1, fill = 'both')
  158.         self.flocals = Frame(top)
  159.         self.flocals.pack(expand = 1, fill = 'both')
  160.         self.fglobals = Frame(top, height = 1)
  161.         self.fglobals.pack(expand = 1, fill = 'both')
  162.         if self.vstack.get():
  163.             self.show_stack()
  164.         
  165.         if self.vlocals.get():
  166.             self.show_locals()
  167.         
  168.         if self.vglobals.get():
  169.             self.show_globals()
  170.         
  171.  
  172.     
  173.     def interaction(self, message, frame, info = None):
  174.         self.frame = frame
  175.         self.status.configure(text = message)
  176.         if info:
  177.             (type, value, tb) = info
  178.             
  179.             try:
  180.                 m1 = type.__name__
  181.             except AttributeError:
  182.                 m1 = '%s' % str(type)
  183.  
  184.             if value is not None:
  185.                 
  186.                 try:
  187.                     m1 = '%s: %s' % (m1, str(value))
  188.  
  189.             
  190.             bg = 'yellow'
  191.         else:
  192.             m1 = ''
  193.             tb = None
  194.             bg = self.errorbg
  195.         self.error.configure(text = m1, background = bg)
  196.         sv = self.stackviewer
  197.         if sv:
  198.             (stack, i) = self.idb.get_stack(self.frame, tb)
  199.             sv.load_stack(stack, i)
  200.         
  201.         self.show_variables(1)
  202.         if self.vsource.get():
  203.             self.sync_source_line()
  204.         
  205.         for b in self.buttons:
  206.             b.configure(state = 'normal')
  207.         
  208.         self.top.wakeup()
  209.         self.root.mainloop()
  210.         for b in self.buttons:
  211.             b.configure(state = 'disabled')
  212.         
  213.         self.status.configure(text = '')
  214.         self.error.configure(text = '', background = self.errorbg)
  215.         self.frame = None
  216.  
  217.     
  218.     def sync_source_line(self):
  219.         frame = self.frame
  220.         if not frame:
  221.             return None
  222.         
  223.         (filename, lineno) = self._Debugger__frame2fileline(frame)
  224.         if filename[:1] + filename[-1:] != '<>' and os.path.exists(filename):
  225.             self.flist.gotofileline(filename, lineno)
  226.         
  227.  
  228.     
  229.     def __frame2fileline(self, frame):
  230.         code = frame.f_code
  231.         filename = code.co_filename
  232.         lineno = frame.f_lineno
  233.         return (filename, lineno)
  234.  
  235.     
  236.     def cont(self):
  237.         self.idb.set_continue()
  238.         self.root.quit()
  239.  
  240.     
  241.     def step(self):
  242.         self.idb.set_step()
  243.         self.root.quit()
  244.  
  245.     
  246.     def next(self):
  247.         self.idb.set_next(self.frame)
  248.         self.root.quit()
  249.  
  250.     
  251.     def ret(self):
  252.         self.idb.set_return(self.frame)
  253.         self.root.quit()
  254.  
  255.     
  256.     def quit(self):
  257.         self.idb.set_quit()
  258.         self.root.quit()
  259.  
  260.     stackviewer = None
  261.     
  262.     def show_stack(self):
  263.         if not (self.stackviewer) and self.vstack.get():
  264.             self.stackviewer = sv = StackViewer(self.fstack, self.flist, self)
  265.             if self.frame:
  266.                 (stack, i) = self.idb.get_stack(self.frame, None)
  267.                 sv.load_stack(stack, i)
  268.             
  269.         else:
  270.             sv = self.stackviewer
  271.             if sv and not self.vstack.get():
  272.                 self.stackviewer = None
  273.                 sv.close()
  274.             
  275.             self.fstack['height'] = 1
  276.  
  277.     
  278.     def show_source(self):
  279.         if self.vsource.get():
  280.             self.sync_source_line()
  281.         
  282.  
  283.     
  284.     def show_frame(self, .1):
  285.         (frame, lineno) = .1
  286.         self.frame = frame
  287.         self.show_variables()
  288.  
  289.     localsviewer = None
  290.     globalsviewer = None
  291.     
  292.     def show_locals(self):
  293.         lv = self.localsviewer
  294.         if self.vlocals.get():
  295.             if not lv:
  296.                 self.localsviewer = NamespaceViewer(self.flocals, 'Locals')
  297.             
  298.         elif lv:
  299.             self.localsviewer = None
  300.             lv.close()
  301.             self.flocals['height'] = 1
  302.         
  303.         self.show_variables()
  304.  
  305.     
  306.     def show_globals(self):
  307.         gv = self.globalsviewer
  308.         if self.vglobals.get():
  309.             if not gv:
  310.                 self.globalsviewer = NamespaceViewer(self.fglobals, 'Globals')
  311.             
  312.         elif gv:
  313.             self.globalsviewer = None
  314.             gv.close()
  315.             self.fglobals['height'] = 1
  316.         
  317.         self.show_variables()
  318.  
  319.     
  320.     def show_variables(self, force = 0):
  321.         lv = self.localsviewer
  322.         gv = self.globalsviewer
  323.         frame = self.frame
  324.         if not frame:
  325.             ldict = None
  326.             gdict = None
  327.         else:
  328.             ldict = frame.f_locals
  329.             gdict = frame.f_globals
  330.             if lv and gv and ldict is gdict:
  331.                 ldict = None
  332.             
  333.         if lv:
  334.             lv.load_dict(ldict, force, self.pyshell.interp.rpcclt)
  335.         
  336.         if gv:
  337.             gv.load_dict(gdict, force, self.pyshell.interp.rpcclt)
  338.         
  339.  
  340.     
  341.     def set_breakpoint_here(self, filename, lineno):
  342.         self.idb.set_break(filename, lineno)
  343.  
  344.     
  345.     def clear_breakpoint_here(self, filename, lineno):
  346.         self.idb.clear_break(filename, lineno)
  347.  
  348.     
  349.     def clear_file_breaks(self, filename):
  350.         self.idb.clear_all_file_breaks(filename)
  351.  
  352.     
  353.     def load_breakpoints(self):
  354.         '''Load PyShellEditorWindow breakpoints into subprocess debugger'''
  355.         pyshell_edit_windows = self.pyshell.flist.inversedict.keys()
  356.         for editwin in pyshell_edit_windows:
  357.             filename = editwin.io.filename
  358.             
  359.             try:
  360.                 for lineno in editwin.breakpoints:
  361.                     self.set_breakpoint_here(filename, lineno)
  362.             continue
  363.             except AttributeError:
  364.                 continue
  365.                 continue
  366.             
  367.  
  368.         
  369.  
  370.  
  371.  
  372. class StackViewer(ScrolledList):
  373.     
  374.     def __init__(self, master, flist, gui):
  375.         if macosxSupport.runningAsOSXApp():
  376.             ScrolledList.__init__(self, master)
  377.         else:
  378.             ScrolledList.__init__(self, master, width = 80)
  379.         self.flist = flist
  380.         self.gui = gui
  381.         self.stack = []
  382.  
  383.     
  384.     def load_stack(self, stack, index = None):
  385.         self.stack = stack
  386.         self.clear()
  387.         for i in range(len(stack)):
  388.             (frame, lineno) = stack[i]
  389.             
  390.             try:
  391.                 modname = frame.f_globals['__name__']
  392.             except:
  393.                 modname = '?'
  394.  
  395.             code = frame.f_code
  396.             filename = code.co_filename
  397.             funcname = code.co_name
  398.             import linecache as linecache
  399.             sourceline = linecache.getline(filename, lineno)
  400.             import string as string
  401.             sourceline = string.strip(sourceline)
  402.             if funcname in ('?', '', None):
  403.                 item = '%s, line %d: %s' % (modname, lineno, sourceline)
  404.             else:
  405.                 item = '%s.%s(), line %d: %s' % (modname, funcname, lineno, sourceline)
  406.             if i == index:
  407.                 item = '> ' + item
  408.             
  409.             self.append(item)
  410.         
  411.         if index is not None:
  412.             self.select(index)
  413.         
  414.  
  415.     
  416.     def popup_event(self, event):
  417.         '''override base method'''
  418.         if self.stack:
  419.             return ScrolledList.popup_event(self, event)
  420.         
  421.  
  422.     
  423.     def fill_menu(self):
  424.         '''override base method'''
  425.         menu = self.menu
  426.         menu.add_command(label = 'Go to source line', command = self.goto_source_line)
  427.         menu.add_command(label = 'Show stack frame', command = self.show_stack_frame)
  428.  
  429.     
  430.     def on_select(self, index):
  431.         '''override base method'''
  432.         if index <= index:
  433.             pass
  434.         elif index < len(self.stack):
  435.             self.gui.show_frame(self.stack[index])
  436.         
  437.  
  438.     
  439.     def on_double(self, index):
  440.         '''override base method'''
  441.         self.show_source(index)
  442.  
  443.     
  444.     def goto_source_line(self):
  445.         index = self.listbox.index('active')
  446.         self.show_source(index)
  447.  
  448.     
  449.     def show_stack_frame(self):
  450.         index = self.listbox.index('active')
  451.         if index <= index:
  452.             pass
  453.         elif index < len(self.stack):
  454.             self.gui.show_frame(self.stack[index])
  455.         
  456.  
  457.     
  458.     def show_source(self, index):
  459.         if index <= index:
  460.             pass
  461.         elif not index < len(self.stack):
  462.             return None
  463.         
  464.         (frame, lineno) = self.stack[index]
  465.         code = frame.f_code
  466.         filename = code.co_filename
  467.         if os.path.isfile(filename):
  468.             edit = self.flist.open(filename)
  469.             if edit:
  470.                 edit.gotoline(lineno)
  471.             
  472.         
  473.  
  474.  
  475.  
  476. class NamespaceViewer:
  477.     
  478.     def __init__(self, master, title, dict = None):
  479.         width = 0
  480.         height = 40
  481.         if dict:
  482.             height = 20 * len(dict)
  483.         
  484.         self.master = master
  485.         self.title = title
  486.         import repr as repr
  487.         self.repr = repr.Repr()
  488.         self.repr.maxstring = 60
  489.         self.repr.maxother = 60
  490.         self.frame = frame = Frame(master)
  491.         self.frame.pack(expand = 1, fill = 'both')
  492.         self.label = Label(frame, text = title, borderwidth = 2, relief = 'groove')
  493.         self.label.pack(fill = 'x')
  494.         self.vbar = vbar = Scrollbar(frame, name = 'vbar')
  495.         vbar.pack(side = 'right', fill = 'y')
  496.         self.canvas = canvas = Canvas(frame, height = min(300, max(40, height)), scrollregion = (0, 0, width, height))
  497.         canvas.pack(side = 'left', fill = 'both', expand = 1)
  498.         vbar['command'] = canvas.yview
  499.         canvas['yscrollcommand'] = vbar.set
  500.         self.subframe = subframe = Frame(canvas)
  501.         self.sfid = canvas.create_window(0, 0, window = subframe, anchor = 'nw')
  502.         self.load_dict(dict)
  503.  
  504.     dict = -1
  505.     
  506.     def load_dict(self, dict, force = 0, rpc_client = None):
  507.         if dict is self.dict and not force:
  508.             return None
  509.         
  510.         subframe = self.subframe
  511.         frame = self.frame
  512.         for c in subframe.children.values():
  513.             c.destroy()
  514.         
  515.         self.dict = None
  516.         if not dict:
  517.             l = Label(subframe, text = 'None')
  518.             l.grid(row = 0, column = 0)
  519.         else:
  520.             names = dict.keys()
  521.             names.sort()
  522.             row = 0
  523.             for name in names:
  524.                 value = dict[name]
  525.                 svalue = self.repr.repr(value)
  526.                 if rpc_client:
  527.                     svalue = svalue[1:-1]
  528.                 
  529.                 l = Label(subframe, text = name)
  530.                 l.grid(row = row, column = 0, sticky = 'nw')
  531.                 l = Entry(subframe, width = 0, borderwidth = 0)
  532.                 l.insert(0, svalue)
  533.                 l.grid(row = row, column = 1, sticky = 'nw')
  534.                 row = row + 1
  535.             
  536.         self.dict = dict
  537.         subframe.update_idletasks()
  538.         width = subframe.winfo_reqwidth()
  539.         height = subframe.winfo_reqheight()
  540.         canvas = self.canvas
  541.         self.canvas['scrollregion'] = (0, 0, width, height)
  542.         if height > 300:
  543.             canvas['height'] = 300
  544.             frame.pack(expand = 1)
  545.         else:
  546.             canvas['height'] = height
  547.             frame.pack(expand = 0)
  548.  
  549.     
  550.     def close(self):
  551.         self.frame.destroy()
  552.  
  553.  
  554.